{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Modeling and Simulation in Python\n",
    "\n",
    "Chapter 18\n",
    "\n",
    "Copyright 2017 Allen Downey\n",
    "\n",
    "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Configure Jupyter so figures appear in the notebook\n",
    "%matplotlib inline\n",
    "\n",
    "# Configure Jupyter to display the assigned value after an assignment\n",
    "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n",
    "\n",
    "# import functions from the modsim.py module\n",
    "from modsim import *"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Code from the previous chapter\n",
    "\n",
    "Read the data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "data = pd.read_csv('data/glucose_insulin.csv', index_col='time');"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Interpolate the insulin data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<function modsim.modsim.interpolate.<locals>.wrapper(x)>"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "I = interpolate(data.insulin)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### The glucose minimal model\n",
    "\n",
    "I'll cheat by starting with parameters that fit the data roughly; then we'll see how to improve them."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>values</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>G0</th>\n",
       "      <td>290.00000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>k1</th>\n",
       "      <td>0.03000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>k2</th>\n",
       "      <td>0.02000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>k3</th>\n",
       "      <td>0.00001</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "G0    290.00000\n",
       "k1      0.03000\n",
       "k2      0.02000\n",
       "k3      0.00001\n",
       "dtype: float64"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "params = Params(G0 = 290,\n",
    "                k1 = 0.03,\n",
    "                k2 = 0.02,\n",
    "                k3 = 1e-05)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here's a version of `make_system` that takes the parameters and data:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "def make_system(params, data):\n",
    "    \"\"\"Makes a System object with the given parameters.\n",
    "    \n",
    "    params: sequence of G0, k1, k2, k3\n",
    "    data: DataFrame with `glucose` and `insulin`\n",
    "    \n",
    "    returns: System object\n",
    "    \"\"\"\n",
    "    G0, k1, k2, k3 = params\n",
    "    \n",
    "    Gb = data.glucose[0]\n",
    "    Ib = data.insulin[0]\n",
    "    I = interpolate(data.insulin)\n",
    "    \n",
    "    t_0 = get_first_label(data)\n",
    "    t_end = get_last_label(data)\n",
    "\n",
    "    init = State(G=G0, X=0)\n",
    "    \n",
    "    return System(params,\n",
    "                  init=init, Gb=Gb, Ib=Ib, I=I,\n",
    "                  t_0=t_0, t_end=t_end, dt=2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>values</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>G0</th>\n",
       "      <td>290</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>k1</th>\n",
       "      <td>0.03</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>k2</th>\n",
       "      <td>0.02</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>k3</th>\n",
       "      <td>1e-05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>init</th>\n",
       "      <td>G    290.0\n",
       "X      0.0\n",
       "dtype: float64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Gb</th>\n",
       "      <td>92</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Ib</th>\n",
       "      <td>11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>I</th>\n",
       "      <td>&lt;function interpolate.&lt;locals&gt;.wrapper at 0x7f...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>t_0</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>t_end</th>\n",
       "      <td>182</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>dt</th>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "G0                                                     290\n",
       "k1                                                    0.03\n",
       "k2                                                    0.02\n",
       "k3                                                   1e-05\n",
       "init                  G    290.0\n",
       "X      0.0\n",
       "dtype: float64\n",
       "Gb                                                      92\n",
       "Ib                                                      11\n",
       "I        <function interpolate.<locals>.wrapper at 0x7f...\n",
       "t_0                                                      0\n",
       "t_end                                                  182\n",
       "dt                                                       2\n",
       "dtype: object"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "system = make_system(params, data)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And here's the update function."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "def update_func(state, t, system):\n",
    "    \"\"\"Updates the glucose minimal model.\n",
    "    \n",
    "    state: State object\n",
    "    t: time in min\n",
    "    system: System object\n",
    "    \n",
    "    returns: State object\n",
    "    \"\"\"\n",
    "    G, X = state\n",
    "    k1, k2, k3 = system.k1, system.k2, system.k3 \n",
    "    I, Ib, Gb = system.I, system.Ib, system.Gb\n",
    "    dt = system.dt\n",
    "        \n",
    "    dGdt = -k1 * (G - Gb) - X*G\n",
    "    dXdt = k3 * (I(t) - Ib) - k2 * X\n",
    "    \n",
    "    G += dGdt * dt\n",
    "    X += dXdt * dt\n",
    "\n",
    "    return State(G=G, X=X)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Before running the simulation, it is always a good idea to test the update function using the initial conditions.  In this case we can veryify that the results are at least qualitatively correct."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>values</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>G</th>\n",
       "      <td>278.12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>X</th>\n",
       "      <td>0.00</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "G    278.12\n",
       "X      0.00\n",
       "dtype: float64"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "update_func(system.init, system.t_0, system)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now `run_simulation` is pretty much the same as it always is."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "def run_simulation(system, update_func):\n",
    "    \"\"\"Runs a simulation of the system.\n",
    "        \n",
    "    system: System object\n",
    "    update_func: function that updates state\n",
    "    \n",
    "    returns: TimeFrame\n",
    "    \"\"\"\n",
    "    init = system.init\n",
    "    t_0, t_end, dt = system.t_0, system.t_end, system.dt\n",
    "    \n",
    "    frame = TimeFrame(columns=init.index)\n",
    "    frame.row[t_0] = init\n",
    "    ts = linrange(t_0, t_end, dt)\n",
    "    \n",
    "    for t in ts:\n",
    "        frame.row[t+dt] = update_func(frame.row[t], t, system)\n",
    "    \n",
    "    return frame"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And here's how we run it."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "results = run_simulation(system, update_func);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The results are in a `TimeFrame` object with one column per state variable."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>G</th>\n",
       "      <th>X</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>290.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>278.120000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>266.952800</td>\n",
       "      <td>0.000300</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>256.295460</td>\n",
       "      <td>0.002668</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>245.070140</td>\n",
       "      <td>0.004041</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>233.905138</td>\n",
       "      <td>0.004680</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>223.201651</td>\n",
       "      <td>0.005252</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>212.984844</td>\n",
       "      <td>0.005722</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>203.288207</td>\n",
       "      <td>0.006093</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>194.133461</td>\n",
       "      <td>0.006330</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>185.547835</td>\n",
       "      <td>0.006490</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>177.526606</td>\n",
       "      <td>0.006610</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>170.048014</td>\n",
       "      <td>0.006726</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>163.077697</td>\n",
       "      <td>0.006813</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>156.590997</td>\n",
       "      <td>0.006872</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30</th>\n",
       "      <td>150.563255</td>\n",
       "      <td>0.006929</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32</th>\n",
       "      <td>144.962829</td>\n",
       "      <td>0.007008</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>34</th>\n",
       "      <td>139.753191</td>\n",
       "      <td>0.007108</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>36</th>\n",
       "      <td>134.901294</td>\n",
       "      <td>0.007172</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38</th>\n",
       "      <td>130.392302</td>\n",
       "      <td>0.007201</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40</th>\n",
       "      <td>126.210925</td>\n",
       "      <td>0.007197</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>42</th>\n",
       "      <td>122.341665</td>\n",
       "      <td>0.007161</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>44</th>\n",
       "      <td>118.769029</td>\n",
       "      <td>0.007094</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>46</th>\n",
       "      <td>115.477698</td>\n",
       "      <td>0.007003</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>48</th>\n",
       "      <td>112.451743</td>\n",
       "      <td>0.006887</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50</th>\n",
       "      <td>109.675836</td>\n",
       "      <td>0.006747</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>52</th>\n",
       "      <td>107.135308</td>\n",
       "      <td>0.006585</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>54</th>\n",
       "      <td>104.816180</td>\n",
       "      <td>0.006402</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>56</th>\n",
       "      <td>102.705192</td>\n",
       "      <td>0.006226</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>58</th>\n",
       "      <td>100.784058</td>\n",
       "      <td>0.006057</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>124</th>\n",
       "      <td>86.390694</td>\n",
       "      <td>0.001095</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>126</th>\n",
       "      <td>86.538102</td>\n",
       "      <td>0.000973</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>128</th>\n",
       "      <td>86.697421</td>\n",
       "      <td>0.000858</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>130</th>\n",
       "      <td>86.866797</td>\n",
       "      <td>0.000750</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>132</th>\n",
       "      <td>87.044539</td>\n",
       "      <td>0.000648</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>134</th>\n",
       "      <td>87.229105</td>\n",
       "      <td>0.000552</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>136</th>\n",
       "      <td>87.419090</td>\n",
       "      <td>0.000462</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>138</th>\n",
       "      <td>87.613215</td>\n",
       "      <td>0.000377</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>140</th>\n",
       "      <td>87.810314</td>\n",
       "      <td>0.000298</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>142</th>\n",
       "      <td>88.009328</td>\n",
       "      <td>0.000224</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>144</th>\n",
       "      <td>88.209296</td>\n",
       "      <td>0.000155</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>146</th>\n",
       "      <td>88.409343</td>\n",
       "      <td>0.000089</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>148</th>\n",
       "      <td>88.609033</td>\n",
       "      <td>0.000026</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>150</th>\n",
       "      <td>88.807970</td>\n",
       "      <td>-0.000036</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>152</th>\n",
       "      <td>89.005799</td>\n",
       "      <td>-0.000094</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>154</th>\n",
       "      <td>89.202200</td>\n",
       "      <td>-0.000150</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>156</th>\n",
       "      <td>89.396887</td>\n",
       "      <td>-0.000204</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>158</th>\n",
       "      <td>89.589604</td>\n",
       "      <td>-0.000256</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>160</th>\n",
       "      <td>89.780123</td>\n",
       "      <td>-0.000306</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>162</th>\n",
       "      <td>89.968242</td>\n",
       "      <td>-0.000354</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>164</th>\n",
       "      <td>90.153784</td>\n",
       "      <td>-0.000400</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>166</th>\n",
       "      <td>90.336592</td>\n",
       "      <td>-0.000446</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>168</th>\n",
       "      <td>90.516892</td>\n",
       "      <td>-0.000492</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>170</th>\n",
       "      <td>90.694895</td>\n",
       "      <td>-0.000538</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>172</th>\n",
       "      <td>90.870797</td>\n",
       "      <td>-0.000585</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>174</th>\n",
       "      <td>91.044781</td>\n",
       "      <td>-0.000631</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>176</th>\n",
       "      <td>91.217018</td>\n",
       "      <td>-0.000678</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>178</th>\n",
       "      <td>91.387668</td>\n",
       "      <td>-0.000725</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>180</th>\n",
       "      <td>91.556880</td>\n",
       "      <td>-0.000772</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>182</th>\n",
       "      <td>91.724792</td>\n",
       "      <td>-0.000819</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>92 rows × 2 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "              G         X\n",
       "0    290.000000  0.000000\n",
       "2    278.120000  0.000000\n",
       "4    266.952800  0.000300\n",
       "6    256.295460  0.002668\n",
       "8    245.070140  0.004041\n",
       "10   233.905138  0.004680\n",
       "12   223.201651  0.005252\n",
       "14   212.984844  0.005722\n",
       "16   203.288207  0.006093\n",
       "18   194.133461  0.006330\n",
       "20   185.547835  0.006490\n",
       "22   177.526606  0.006610\n",
       "24   170.048014  0.006726\n",
       "26   163.077697  0.006813\n",
       "28   156.590997  0.006872\n",
       "30   150.563255  0.006929\n",
       "32   144.962829  0.007008\n",
       "34   139.753191  0.007108\n",
       "36   134.901294  0.007172\n",
       "38   130.392302  0.007201\n",
       "40   126.210925  0.007197\n",
       "42   122.341665  0.007161\n",
       "44   118.769029  0.007094\n",
       "46   115.477698  0.007003\n",
       "48   112.451743  0.006887\n",
       "50   109.675836  0.006747\n",
       "52   107.135308  0.006585\n",
       "54   104.816180  0.006402\n",
       "56   102.705192  0.006226\n",
       "58   100.784058  0.006057\n",
       "..          ...       ...\n",
       "124   86.390694  0.001095\n",
       "126   86.538102  0.000973\n",
       "128   86.697421  0.000858\n",
       "130   86.866797  0.000750\n",
       "132   87.044539  0.000648\n",
       "134   87.229105  0.000552\n",
       "136   87.419090  0.000462\n",
       "138   87.613215  0.000377\n",
       "140   87.810314  0.000298\n",
       "142   88.009328  0.000224\n",
       "144   88.209296  0.000155\n",
       "146   88.409343  0.000089\n",
       "148   88.609033  0.000026\n",
       "150   88.807970 -0.000036\n",
       "152   89.005799 -0.000094\n",
       "154   89.202200 -0.000150\n",
       "156   89.396887 -0.000204\n",
       "158   89.589604 -0.000256\n",
       "160   89.780123 -0.000306\n",
       "162   89.968242 -0.000354\n",
       "164   90.153784 -0.000400\n",
       "166   90.336592 -0.000446\n",
       "168   90.516892 -0.000492\n",
       "170   90.694895 -0.000538\n",
       "172   90.870797 -0.000585\n",
       "174   91.044781 -0.000631\n",
       "176   91.217018 -0.000678\n",
       "178   91.387668 -0.000725\n",
       "180   91.556880 -0.000772\n",
       "182   91.724792 -0.000819\n",
       "\n",
       "[92 rows x 2 columns]"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "results"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The following plot shows the results of the simulation along with the actual glucose data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saving figure to file figs/chap18-fig01.pdf\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "subplot(2, 1, 1)\n",
    "\n",
    "plot(results.G, 'b-', label='simulation')\n",
    "plot(data.glucose, 'bo', label='glucose data')\n",
    "decorate(ylabel='Concentration (mg/dL)')\n",
    "\n",
    "subplot(2, 1, 2)\n",
    "\n",
    "plot(results.X, 'C1', label='remote insulin')\n",
    "\n",
    "decorate(xlabel='Time (min)', \n",
    "         ylabel='Concentration (arbitrary units)')\n",
    "\n",
    "savefig('figs/chap18-fig01.pdf')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Numerical solution\n",
    "\n",
    "Now let's solve the differential equation numerically using `run_ode_solver`, which is an implementation of Ralston's method.\n",
    "\n",
    "Instead of an update function, we provide a slope function that evaluates the right-hand side of the differential equations.\n",
    "\n",
    "We don't have to do the update part; the solver does it for us."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "def slope_func(state, t, system):\n",
    "    \"\"\"Computes derivatives of the glucose minimal model.\n",
    "    \n",
    "    state: State object\n",
    "    t: time in min\n",
    "    system: System object\n",
    "    \n",
    "    returns: derivatives of G and X\n",
    "    \"\"\"\n",
    "    G, X = state\n",
    "    k1, k2, k3 = system.k1, system.k2, system.k3 \n",
    "    I, Ib, Gb = system.I, system.Ib, system.Gb\n",
    "    \n",
    "    dGdt = -k1 * (G - Gb) - X*G\n",
    "    dXdt = k3 * (I(t) - Ib) - k2 * X\n",
    "    \n",
    "    return dGdt, dXdt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can test the slope function with the initial conditions."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(-5.9399999999999995, 0.0)"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "slope_func(system.init, 0, system)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here's how we run the ODE solver."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "results2, details = run_ode_solver(system, slope_func)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`details` is a `ModSimSeries` object with information about how the solver worked."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>values</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>success</th>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>message</th>\n",
       "      <td>The solver successfully reached the end of the...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "success                                                 True\n",
       "message    The solver successfully reached the end of the...\n",
       "dtype: object"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "details"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`results` is a `TimeFrame` with one row for each time step and one column for each state variable:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>G</th>\n",
       "      <th>X</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>290.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>278.476400</td>\n",
       "      <td>0.000150</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>267.464465</td>\n",
       "      <td>0.001478</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>255.898956</td>\n",
       "      <td>0.003303</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>244.423982</td>\n",
       "      <td>0.004284</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>233.420932</td>\n",
       "      <td>0.004880</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>222.905305</td>\n",
       "      <td>0.005393</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>212.909446</td>\n",
       "      <td>0.005808</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>203.454111</td>\n",
       "      <td>0.006108</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>194.566003</td>\n",
       "      <td>0.006306</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>186.240256</td>\n",
       "      <td>0.006439</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>178.458757</td>\n",
       "      <td>0.006559</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>171.185070</td>\n",
       "      <td>0.006662</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>164.395933</td>\n",
       "      <td>0.006738</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>158.067772</td>\n",
       "      <td>0.006793</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30</th>\n",
       "      <td>152.171731</td>\n",
       "      <td>0.006864</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32</th>\n",
       "      <td>146.670366</td>\n",
       "      <td>0.006956</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>34</th>\n",
       "      <td>141.531725</td>\n",
       "      <td>0.007040</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>36</th>\n",
       "      <td>136.741833</td>\n",
       "      <td>0.007089</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38</th>\n",
       "      <td>132.285774</td>\n",
       "      <td>0.007105</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40</th>\n",
       "      <td>128.148400</td>\n",
       "      <td>0.007088</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>42</th>\n",
       "      <td>124.314528</td>\n",
       "      <td>0.007042</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>44</th>\n",
       "      <td>120.769107</td>\n",
       "      <td>0.006967</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>46</th>\n",
       "      <td>117.496427</td>\n",
       "      <td>0.006868</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>48</th>\n",
       "      <td>114.481355</td>\n",
       "      <td>0.006746</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50</th>\n",
       "      <td>111.709352</td>\n",
       "      <td>0.006601</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>52</th>\n",
       "      <td>109.166524</td>\n",
       "      <td>0.006434</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>54</th>\n",
       "      <td>106.839640</td>\n",
       "      <td>0.006260</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>56</th>\n",
       "      <td>104.710408</td>\n",
       "      <td>0.006093</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>58</th>\n",
       "      <td>102.762318</td>\n",
       "      <td>0.005932</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>124</th>\n",
       "      <td>86.966171</td>\n",
       "      <td>0.001074</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>126</th>\n",
       "      <td>87.088335</td>\n",
       "      <td>0.000957</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>128</th>\n",
       "      <td>87.222428</td>\n",
       "      <td>0.000846</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>130</th>\n",
       "      <td>87.366704</td>\n",
       "      <td>0.000741</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>132</th>\n",
       "      <td>87.519569</td>\n",
       "      <td>0.000642</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>134</th>\n",
       "      <td>87.679564</td>\n",
       "      <td>0.000549</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>136</th>\n",
       "      <td>87.845355</td>\n",
       "      <td>0.000462</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>138</th>\n",
       "      <td>88.015722</td>\n",
       "      <td>0.000381</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>140</th>\n",
       "      <td>88.189550</td>\n",
       "      <td>0.000304</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>142</th>\n",
       "      <td>88.365824</td>\n",
       "      <td>0.000232</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>144</th>\n",
       "      <td>88.543616</td>\n",
       "      <td>0.000164</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>146</th>\n",
       "      <td>88.722428</td>\n",
       "      <td>0.000099</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>148</th>\n",
       "      <td>88.901796</td>\n",
       "      <td>0.000036</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>150</th>\n",
       "      <td>89.081302</td>\n",
       "      <td>-0.000024</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>152</th>\n",
       "      <td>89.260563</td>\n",
       "      <td>-0.000082</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>154</th>\n",
       "      <td>89.439233</td>\n",
       "      <td>-0.000137</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>156</th>\n",
       "      <td>89.617001</td>\n",
       "      <td>-0.000191</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>158</th>\n",
       "      <td>89.793584</td>\n",
       "      <td>-0.000242</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>160</th>\n",
       "      <td>89.968729</td>\n",
       "      <td>-0.000291</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>162</th>\n",
       "      <td>90.142209</td>\n",
       "      <td>-0.000339</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>164</th>\n",
       "      <td>90.313821</td>\n",
       "      <td>-0.000385</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>166</th>\n",
       "      <td>90.483737</td>\n",
       "      <td>-0.000432</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>168</th>\n",
       "      <td>90.652108</td>\n",
       "      <td>-0.000479</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>170</th>\n",
       "      <td>90.819076</td>\n",
       "      <td>-0.000526</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>172</th>\n",
       "      <td>90.984773</td>\n",
       "      <td>-0.000573</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>174</th>\n",
       "      <td>91.149324</td>\n",
       "      <td>-0.000620</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>176</th>\n",
       "      <td>91.312844</td>\n",
       "      <td>-0.000667</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>178</th>\n",
       "      <td>91.475442</td>\n",
       "      <td>-0.000714</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>180</th>\n",
       "      <td>91.637217</td>\n",
       "      <td>-0.000762</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>182</th>\n",
       "      <td>91.798265</td>\n",
       "      <td>-0.000809</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>92 rows × 2 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "              G         X\n",
       "0    290.000000  0.000000\n",
       "2    278.476400  0.000150\n",
       "4    267.464465  0.001478\n",
       "6    255.898956  0.003303\n",
       "8    244.423982  0.004284\n",
       "10   233.420932  0.004880\n",
       "12   222.905305  0.005393\n",
       "14   212.909446  0.005808\n",
       "16   203.454111  0.006108\n",
       "18   194.566003  0.006306\n",
       "20   186.240256  0.006439\n",
       "22   178.458757  0.006559\n",
       "24   171.185070  0.006662\n",
       "26   164.395933  0.006738\n",
       "28   158.067772  0.006793\n",
       "30   152.171731  0.006864\n",
       "32   146.670366  0.006956\n",
       "34   141.531725  0.007040\n",
       "36   136.741833  0.007089\n",
       "38   132.285774  0.007105\n",
       "40   128.148400  0.007088\n",
       "42   124.314528  0.007042\n",
       "44   120.769107  0.006967\n",
       "46   117.496427  0.006868\n",
       "48   114.481355  0.006746\n",
       "50   111.709352  0.006601\n",
       "52   109.166524  0.006434\n",
       "54   106.839640  0.006260\n",
       "56   104.710408  0.006093\n",
       "58   102.762318  0.005932\n",
       "..          ...       ...\n",
       "124   86.966171  0.001074\n",
       "126   87.088335  0.000957\n",
       "128   87.222428  0.000846\n",
       "130   87.366704  0.000741\n",
       "132   87.519569  0.000642\n",
       "134   87.679564  0.000549\n",
       "136   87.845355  0.000462\n",
       "138   88.015722  0.000381\n",
       "140   88.189550  0.000304\n",
       "142   88.365824  0.000232\n",
       "144   88.543616  0.000164\n",
       "146   88.722428  0.000099\n",
       "148   88.901796  0.000036\n",
       "150   89.081302 -0.000024\n",
       "152   89.260563 -0.000082\n",
       "154   89.439233 -0.000137\n",
       "156   89.617001 -0.000191\n",
       "158   89.793584 -0.000242\n",
       "160   89.968729 -0.000291\n",
       "162   90.142209 -0.000339\n",
       "164   90.313821 -0.000385\n",
       "166   90.483737 -0.000432\n",
       "168   90.652108 -0.000479\n",
       "170   90.819076 -0.000526\n",
       "172   90.984773 -0.000573\n",
       "174   91.149324 -0.000620\n",
       "176   91.312844 -0.000667\n",
       "178   91.475442 -0.000714\n",
       "180   91.637217 -0.000762\n",
       "182   91.798265 -0.000809\n",
       "\n",
       "[92 rows x 2 columns]"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "results2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Plotting the results from `run_simulation` and `run_ode_solver`, we can see that they are not very different."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saving figure to file figs/chap18-fig02.pdf\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nOzdeXxU1d3H8c/s2QmEBAhbEMiByL6vSkFFxK11qYoFq60LLvXx6aK1dWlV1FYe11Zt1boh1WpVpIKKrLLLKsthh4SQkITsyWQyM/f54w5pQEgGSHIn4fd+veblzF2/GSQ/zr3nnmMzDAMhhBAi0titDiCEEEKciBQoIYQQEUkKlBBCiIgkBUoIIUREkgIlhBAiIkmBEkIIEZGcTXkypdSlwBNAN+Aw8LTW+hWllBt4EbgaCAAztdYzau13bWi/DsBi4Cat9eGmzC6EEKJpNVkLSinVAfgX8ButdTxwDfCsUmoQ8CiggO7AUGCaUmpqaL8M4DXgJiAJ2AnMbqrcQgghrNFkBUprfQhI1lp/rpSyYxYbP1AKTAMe11oXaq33AX8GbgvteiMwR2u9TGvtBR4ARiulejZVdiGEEE2vSS/xaa1LlVIxQHHo3E8BeZiX7rbW2nQ70Df0PgNYW+sYFUqpzND6nfWdUynlwWyVHcK8fCiEECJyODBrwBqtdVXtFU1aoEK8QCzQD/gPUBlaXlFrmwogJvQ+7rh1x6+vz1Bg6WklFUII0VTGAstqL2jyAqW1DgI+YK1S6lVgSGhVdK3NYoCy0Pvy49Ydv74+hwDeffdd2rdvf1qZhRBCNI6cnBymTJkCod/VtTVZgVJKnY/ZO29wrcUeoBDIwewkcTC0vBf/veS3NbTu6HFigC4ce0mwLgGA9u3b06lTp9POL4QQolF97xZMU7agNgAdlVL3Ac8Bw4FbgB9iFqiHlVKbMC/p/TK0DcAsYJlSahywApgBrNda72jC7EIIIZpYU/biKwYuAX4EHAFeBX6mtV4MPAR8B2wB1gAfAi+H9tsM3Bz6nA+ci9lFXQghRAvW1L341gFjTrDcC9wZep1ovw8xi5YQQoizhAx1JIQQIiJJgRJCCBGRpEDVo9ofpLisqv4NhRBCNCgpUPV46cN13Pzsu3x3INPqKEIIcVaRAlWPPSzH0XMN/9qw0OooQghxVpECVY8RXfoDsLNku8VJhBDi7CIFqh6XDhiGEXBQ7SpkR0621XGEEOK0eb1e8vPzrY4RNilQ9UiIjiYx2BmAORu/sTiNEKI5mzx5MgsXNuztghdeeIHp06eHte2NN97Ihg0bAPj000+57rrrGjRLQ7NiNPNmZ1CHfizM38fm/C3IIBZCiNM1d+5cS89/5MiRmveXX345l19+uYVp6icFKgxXDBzB1/PnUO7IJbekkHYJra2OJEREevTvK1m7LbfJzjekdzse/tmIsLbNysrisssuY/LkycybN4+oqCgmTZrEgw8+CMCqVau48847Wbt2LatWreIPf/gD559/Ph9++CEej4drrrmGu+++u97z7N+/nwcffJDt27eTmJjIhRdeyK9+9Svsdjvjx4/nt7/9LRdccAHjx49n2rRpzJo1i9zcXCZOnMhVV13Fo48+SnZ2NuPHj+fpp5/G4XAcsx+YraZt27bxl7/85Zhz+3w+nn76aZYsWcLhw4dJTk7m3nvvZfLkydx5551kZ2dz3333cffdd5OUlMSbb77JJ598AsDbb7/Nm2++SVFREb179+bBBx+kV69eNd/bPffcw2uvvUYgEOCiiy7i4Ycfxm5v3ItwcokvDKltWhNd3Q6jKobl23dbHUcIcZoqKipo06YNy5cvZ9CgQXVuu2vXLlwuF8uWLeOJJ57gpZdeYvfu+v/+z5gxg4EDB7J69Wrefvtt5s6dy9q1a0+47b/+9S/ee+895s6dy7x583jyySd58803+eyzz1i6dCmLFy8+pZ/v9ddf57vvvuODDz5g3bp1TJ06lYceegi/389LL71EamoqM2fO5Oc///kx+73//vu88sorPP/886xYsYJx48Zxyy23UFJSApjfm9aar776itdee41PP/2UpUsbf5o9aUGF6eIOV/HevF3s99hhmNVphIhM4bZmrHTZZZfhdruJial7zlObzcb06dNxuVyMGTOG5ORk9u/fT/fu3evcLy4ujtWrV/P1118zYsQIFi1adNKWxtSpU2nTpg0AXbp04fLLL6dt27YA9OzZk6ysrFP62a677jquvfZaEhISyM3NJTo6mrKyMiorK4mPjz/pfh9//DFTp04lIyMDgFtuuYUPPviARYsW1RTyW2+9laioKDIyMlBKceDAgVPKdjqkBRWmMX27ADbWbM0lEDSsjiOEOE0pKSlhbRcXF4fH46n57HK5CAaD9e73yCOP0LdvX5544gmGDx/O9OnTOXz48Am3TUxMrHlvt9tJSEg45nM456utrKyM+++/nxEjRjB9+nRWrFgBgGHU/TuroKCAjh07HrOsY8eO5OTk1Hw+WjjB/C4Cge9N39TgpECFqXO7eDq0jaW0upjl23daHUcIcZpsNhtgFoDq6uqa5UVFRQ1y/O3bt3PPPffw9ddfM2fOHEpLS3nuuedOuO3RLPWx2+34fL56sz788MN06tSJb775ho8++ohbbrklrOOnpqZy8ODBY5ZlZWWRlJQU1v6NRQpUmGw2G51UIVEDFvOvrZ9ZHUcIcYbS0tJYsmQJeXl5FBYW8s477zTIcWfOnMnzzz+Pz+ejXbt2uFwuWrVqdcZZP//8cyorK9mxYwfz588/4XalpaV4PB7sdjuHDx/mmWeeAagpxC6Xi9LS0u/td+WVV/LWW2+xbds2qquree211zhy5Ajjxo07o9xnSgrUKThfmaNKHKreS5XfV8/WQohIdv3119OvXz8mTZrEj3/8Yy6++OIGOe6TTz7J7t27GTVqFOPGjSM5OTns55RO5je/+Q15eXmMGjWKhx56iKuuuuqE2z344IMsW7aMwYMHc9111zF06FBat27Njh3mBOQ/+tGPePTRR5k5c+Yx+11xxRX87Gc/45577mHYsGE1nSGsbkHZ6rs22dwppdKAvQsWLKBTp05ndKxAIMgNbz+AEV3CTedO45I+kX9DWAghIllWVhYTJkwA6Ka13ld7nbSgToHDYadrjALgqx2rLE4jhBAtm3QzP0UXqRG8un0NB6t2Ux2oxuVwWR1JCNGERo8eTUVFxQnXDR8+nJdffrmJE7VcUqBO0bg+vXh1fQJGdAlf6/VMzJCHooQ4m3zzjYzJ2VTkEt8pcjrsdPb0xAjaWLN7j9VxhBCixZICdRqu6DMB77oJ5O1sb3UUIYRosaRAnYaRvbsQ7Ypiz8FicgrKrY4jhBAtkhSo0+ByOhiW0R5sQT5ft9nqOEII0SJJgTpN/TPiiRqwkPn57+EPNv6YVEIIcbaRAnWaxvY5BwIegnYfy3dLK0oIIRqaFKjTFOV20sHZA4B521danEYIIVoeKVBnYFz3IQDsKdUEjVMbFl8IIQDGjx/PV199Zcm5V61axZAhQyw5dzjkQd0zMGlAP97bGU3QXcnqvdsZcU6G1ZGEsNy1/7zjpOtuHXIDF3QfC8BXu5fy6tpZJ932/R//teb9b754gr2FmXVuI1oeaUGdgegoF+0d5wDwn+9WWJxGCFGXrKwsBg4cyO9+9zuGDBnCmDFjePzxx2vW125NrFq1ismTJ/P0008zfPhwzjvvPF544YWwzuP3+3n++ec5//zzGT58OLfffvsxM+N+9tlnXHDBBQwaNIjHHnvsmIn/iouLeeCBBxg9ejTnn38+M2fOxO/313vOYDDIE088wahRoxg5ciS33HJLzYy39eU56rrrruMf//hHzefCwkL69OlDZmYmgUCAl19+mQkTJjB8+HB+8YtfcOTIkZrvauLEidx+++0MHTr0lKepr5NhGC36lZ6enpaenm5kZmYajeH9FcuNa2bfbkx58+FGOb4QomFkZmYa6enpxjPPPGNUVVUZd999t/HYY4/VrF+5cqUxePDgmvfp6enGzJkzDZ/PZyxdutRQShm7du2q9zwzZ840Jk+ebBw4cMDwer3GH//4R2Py5MmGz+cztm3bZvTp08dYunSp4fP5jBdeeMFIT083vvzyS8MwDOO2224z7r77bqO0tNTIzc01fvzjHxsvvvhiveecN2+eMXHiRKOoqMjw+XzG/fffb/z2t7+tN0/tn3n27NnGVVddVXPMWbNmGTfccINhGIbx+uuvG5MmTTL2799vVFZWGo888ogxderUY76r9957z6isrDSqqqrC+eOocfTPJT09Pc047ve3tKDO0KUDB8OOsRRvHEB2XpnVcYQQ9bjssstwu93ExMTUuZ3NZmP69Om4XC7GjBlDcnIy+/fvr/f4H3/8MdOnT6dz5854PB5+/etfk52dzaZNm5g/fz6jR49mzJgxuFwu7rjjjppp3/Pz81m4cCEPPfQQcXFxpKSkcOeddzJ79ux6zxkfH8/hw4f55JNPyMnJ4fHHH69pHdaVp7ZLLrmEHTt21PyMc+bM4corrwTg/fff56677qJLly5ERUXxq1/9ijVr1rBv375jvteoqCjcbne9ecMlBeoMRXvcjOzRC7CxdMPBercXQlgrJSUlrO3i4uLweDw1n10uF8Fg/Z2hCgoKSE1NrfnsdrtJSUkhJyeH/Px82rVrV7PO4XDQoUMHALKzswG4+OKLGTJkCEOGDOHee++luLiYqqqqOs95dCLD//znP0ycOJFJkybx9ddf15un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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot(results.G, 'C0', label='run_simulation')\n",
    "plot(results2.G, 'C2--', label='run_ode_solver')\n",
    "\n",
    "decorate(xlabel='Time (min)', ylabel='Concentration (mg/dL)')\n",
    "\n",
    "savefig('figs/chap18-fig02.pdf')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The differences in `G` are less than 2%."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0      0.000000\n",
       "2     -0.127982\n",
       "4     -0.191302\n",
       "6      0.154946\n",
       "8      0.264360\n",
       "10     0.207439\n",
       "12     0.132947\n",
       "14     0.035413\n",
       "16    -0.081544\n",
       "18    -0.222312\n",
       "20    -0.371789\n",
       "22    -0.522334\n",
       "24    -0.664226\n",
       "26    -0.801867\n",
       "28    -0.934267\n",
       "30    -1.057014\n",
       "32    -1.164200\n",
       "34    -1.256633\n",
       "36    -1.345996\n",
       "38    -1.431350\n",
       "40    -1.511900\n",
       "42    -1.586993\n",
       "44    -1.656117\n",
       "46    -1.718120\n",
       "48    -1.772875\n",
       "50    -1.820363\n",
       "52    -1.860658\n",
       "54    -1.893922\n",
       "56    -1.915011\n",
       "58    -1.925084\n",
       "         ...   \n",
       "124   -0.661724\n",
       "126   -0.631811\n",
       "128   -0.601917\n",
       "130   -0.572193\n",
       "132   -0.542770\n",
       "134   -0.513756\n",
       "136   -0.485244\n",
       "138   -0.457312\n",
       "140   -0.430024\n",
       "142   -0.403431\n",
       "144   -0.377577\n",
       "146   -0.352881\n",
       "148   -0.329311\n",
       "150   -0.306834\n",
       "152   -0.285416\n",
       "154   -0.265021\n",
       "156   -0.245616\n",
       "158   -0.227165\n",
       "160   -0.209635\n",
       "162   -0.192991\n",
       "164   -0.177201\n",
       "166   -0.162620\n",
       "168   -0.149158\n",
       "170   -0.136734\n",
       "172   -0.125270\n",
       "174   -0.114695\n",
       "176   -0.104943\n",
       "178   -0.095953\n",
       "180   -0.087669\n",
       "182   -0.080037\n",
       "Name: G, Length: 92, dtype: float64"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "diff = results.G - results2.G\n",
    "percent_diff = diff / results2.G * 100\n",
    "percent_diff"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1.9252541088148694"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "max(abs(percent_diff))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Exercises\n",
    "\n",
    "**Exercise:**  Our solution to the differential equations is only approximate because we used a finite step size, `dt=2` minutes.\n",
    "\n",
    "If we make the step size smaller, we expect the solution to be more accurate.  Run the simulation with `dt=1` and compare the results.  What is the largest relative error between the two solutions?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>values</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>success</th>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>message</th>\n",
       "      <td>The solver successfully reached the end of the...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "success                                                 True\n",
       "message    The solver successfully reached the end of the...\n",
       "dtype: object"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Solution\n",
    "\n",
    "system3 = System(system, dt=1)\n",
    "results3, details = run_ode_solver(system3, slope_func)\n",
    "details"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nO3dd3hUVf7H8Xcy6aTRQpEqmoOI9CJNumIBVBRFXHVtWHdX113XsrpWWHX9Ydu1rOuubbGgq6IURQVBCUUQNHIQJFJDSyGF9Pn9cSdhEgghkMwdwuf1PHmYuffOnU9uhvnOPXPuOSFerxcREZFgE+p2ABERkYNRgRIRkaCkAiUiIkFJBUpERIKSCpSIiAQlFSgREQlKYYF8MmPMecCjQEdgJ/CYtfYFY0wE8CxwEVAKPGmtner3uIm+x7UCFgBXWWt3BjK7iIgEVsDOoIwxrYB3gTuttXHAxcB0Y0wv4AHAAJ2AvsCVxpgrfI/rArwMXAU0BX4CZgQqt4iIuCNgBcpaux1obq2dbYwJxSk2JUAOcCXwiLU201qbBjwBTPE99HLgI2vtImttAXAXMMgYc3KgsouISOAFtInPWptjjIkBsn3P/VdgF07TXarfpmuB03y3uwDL/faRb4zZ7Fv/U03PaYyJxDkr247TfCgiIsHDg1MDlllrC/1XBLRA+RQAjYBuwCfAPt/yfL9t8oEY3+3YKuuqrq9JX+CrI0oqIiKBMgRY5L8g4AXKWlsGFAHLjTEvAn18q6L9NosBcn2386qsq7q+JtsB3njjDVq2bHlEmUVEpH6kp6czefJk8L1X+wtYgTLGDMXpndfbb3EkkAmk43SS2Opb3pn9TX6pvnXl+4kB2lG5SfBQSgFatmxJmzZtjji/iIjUqwO+ggnkGdQq4ARjzO3AU0B/4BrgApwCdb8xZjVOk94dvm0A3gQWGWOGAd8AU4GV1tp1AcwuIiIBFshefNnAOcCFQAbwInCttXYBcB/wPfADsAyYCTzve9wa4Grf/d3AqThd1EVEpAELdC++b4HBB1leANzs+znY42biFC0RETlOaKgjEREJSipQIiISlFSgREQkKKlA1aC0uJjVi+eRvnmD21FERI4rKlA1mD31bnIee4FVH77tdhQRkeOKClQNmvfpS1ash7QCze4hIhJIKlA16D5qHP89vwWftylgd36G23FEROrMjh07KC4udjtGtVSgahAVEUWPVl0BWL51tctpRORIjRgxgs8++8yV505JSaFPnz41b1gH5s+fz0MPPXTQde+99x7jx48HYPfu3YwZM4Z9+/YddNuqNm3axHXXXUe/fv0YPHgwDz/8MEVFRQB888033HPPPXXzC/hRgToMfU/oTliJl3UpC9yOIiJSrdzcXB577DFuueWWGrctKCggP7/qRBHVu/nmm0lOTmbRokW89957fPfddzz77LMADBgwgD179rB48eIjzn4wbky3cczp2TSZa9/fTVjJLrLO2UlikyS3I4kw8a0bq113fZ/LGNVpCACfbfiKF5e/We22b1/yj4rbd857lI2Zm6tdX5MtW7YwduxYzj33XObMmcMdd9zBqlWriIuLq/iEnZKSws0338zy5ctJSUnhwQcfZOjQocycOZPIyEguvvhibr311hqfq6SkhL///e/MnDmTgoICevbsyb333lsxKPSsWbOYPn06GRkZXHjhhZSW7h+LNDs7m2nTprFw4ULCwsIYP348v/nNbwgLO/RbYllZGdOmTWPWrFl4vV66dOnC/fffT7t27WrMU+7SSy9lzJgxXHXVVQBkZmYyZMgQZs+eTevWrXnppZd45513yM3N5fTTT+f++++nSZMmpKSkcN9999GxY0dWrFjBE088wdChQyvt+6233qJ37940btwYgKysLP785z+zePFikpKSGDhwYMW2EyZMAGDo0KH861//4rnnnmPFihUH/M5Tpkxh0qRJJCUlcdNNNxEREUFSUhJjx45l7ty5FdtNnDiRZ555hkGDBtX0pztsOoM6DPHxTchrmUBmsyjSt/zsdhyRoJafn0+TJk34+uuvGTduXI3br1+/nvDwcBYtWsSjjz7Kc889x4YNNV/W8cwzzzBv3jxef/11Fi5cSJs2bbjhhhsoLi5m7dq13HXXXfzlL38hJSWFxMRE0tPTKx575513kpeXx9y5c3nnnXdYunQpL7zwQo3P+emnn7Jw4UJmz57NwoULSUpKqnjcofL4u+CCC5g1a1bF/Tlz5tC9e3fatm3Lq6++yocffsgrr7zCggULaNKkCbfddlvFtmlpaQwbNoyvvvqKAQMGHJDvnXfe4eyzz664f99991FUVMTChQt54YUXWLBgfyvQzJnO6HELFiygZ8+e/POf/2Tl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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Solution\n",
    "\n",
    "plot(results2.G, 'C2--', label='run_ode_solver (dt=2)')\n",
    "plot(results3.G, 'C3:', label='run_ode_solver (dt=1)')\n",
    "\n",
    "decorate(xlabel='Time (m)', ylabel='mg/dL')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0      0.000000\n",
       "2      0.009372\n",
       "4      0.061820\n",
       "6      0.031912\n",
       "8      0.012039\n",
       "10     0.011405\n",
       "12     0.010124\n",
       "14     0.009322\n",
       "16     0.007946\n",
       "18     0.008430\n",
       "20     0.009144\n",
       "22     0.011609\n",
       "24     0.013346\n",
       "26     0.015050\n",
       "28     0.016702\n",
       "30     0.019412\n",
       "32     0.021838\n",
       "34     0.022601\n",
       "36     0.023359\n",
       "38     0.024093\n",
       "40     0.024789\n",
       "42     0.025433\n",
       "44     0.026113\n",
       "46     0.026703\n",
       "48     0.027200\n",
       "50     0.027601\n",
       "52     0.027907\n",
       "54     0.028811\n",
       "56     0.029488\n",
       "58     0.029959\n",
       "         ...   \n",
       "124    0.010964\n",
       "126    0.010626\n",
       "128    0.010277\n",
       "130    0.009921\n",
       "132    0.009561\n",
       "134    0.009198\n",
       "136    0.008834\n",
       "138    0.008472\n",
       "140    0.008113\n",
       "142    0.007758\n",
       "144    0.007359\n",
       "146    0.006976\n",
       "148    0.006608\n",
       "150    0.006255\n",
       "152    0.005917\n",
       "154    0.005594\n",
       "156    0.005284\n",
       "158    0.004988\n",
       "160    0.004705\n",
       "162    0.004434\n",
       "164    0.004127\n",
       "166    0.003841\n",
       "168    0.003574\n",
       "170    0.003326\n",
       "172    0.003096\n",
       "174    0.002881\n",
       "176    0.002681\n",
       "178    0.002495\n",
       "180    0.002322\n",
       "182    0.002161\n",
       "Name: G, Length: 92, dtype: float64"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Solution\n",
    "\n",
    "diff = (results2.G - results3.G).dropna()\n",
    "percent_diff = diff / results2.G * 100"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.061819954534205544"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Solution\n",
    "\n",
    "max(abs(percent_diff))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Under the hood\n",
    "\n",
    "Here's the source code for `run_ode_solver` if you'd like to know how it works.\n",
    "\n",
    "Notice that `run_ode_solver` is another name for `run_ralston`, which implements [Ralston's method](https://en.wikipedia.org/wiki/List_of_Runge–Kutta_methods)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "def run_ralston(system, slope_func, **options):\n",
      "    \"\"\"Computes a numerical solution to a differential equation.\n",
      "\n",
      "    `system` must contain `init` with initial conditions,\n",
      "     and `t_end` with the end time.\n",
      "\n",
      "     `system` may contain `t_0` to override the default, 0\n",
      "\n",
      "    It can contain any other parameters required by the slope function.\n",
      "\n",
      "    `options` can be ...\n",
      "\n",
      "    system: System object\n",
      "    slope_func: function that computes slopes\n",
      "\n",
      "    returns: TimeFrame\n",
      "    \"\"\"\n",
      "    # the default message if nothing changes\n",
      "    msg = \"The solver successfully reached the end of the integration interval.\"\n",
      "\n",
      "    # get parameters from system\n",
      "    init, t_0, t_end, dt = check_system(system, slope_func)\n",
      "\n",
      "    # make the TimeFrame\n",
      "    frame = TimeFrame(columns=init.index)\n",
      "    frame.row[t_0] = init\n",
      "    ts = linrange(t_0, t_end, dt) * get_units(t_end)\n",
      "\n",
      "    event_func = options.get('events', None)\n",
      "    z1 = np.nan\n",
      "\n",
      "    def project(y1, t1, slopes, dt):\n",
      "        t2 = t1 + dt\n",
      "        y2 = [y + slope * dt for y, slope in zip(y1, slopes)]\n",
      "        return y2, t2\n",
      "\n",
      "    # run the solver\n",
      "    for t1 in ts:\n",
      "        y1 = frame.row[t1]\n",
      "\n",
      "        # evaluate the slopes at the start of the time step\n",
      "        slopes1 = slope_func(y1, t1, system)\n",
      "\n",
      "        # evaluate the slopes at the two-thirds point\n",
      "        y_mid, t_mid = project(y1, t1, slopes1, 2 * dt / 3)\n",
      "        slopes2 = slope_func(y_mid, t_mid, system)\n",
      "\n",
      "        # compute the weighted sum of the slopes\n",
      "        slopes = [(k1 + 3 * k2) / 4 for k1, k2 in zip(slopes1, slopes2)]\n",
      "\n",
      "        # compute the next time stamp\n",
      "        y2, t2 = project(y1, t1, slopes, dt)\n",
      "\n",
      "        # check for a terminating event\n",
      "        if event_func:\n",
      "            z2 = event_func(y2, t2, system)\n",
      "            if z1 * z2 < 0:\n",
      "                scale = magnitude(z1 / (z1 - z2))\n",
      "                y2, t2 = project(y1, t1, slopes, scale * dt)\n",
      "                frame.row[t2] = y2\n",
      "                msg = \"A termination event occurred.\"\n",
      "                break\n",
      "            else:\n",
      "                z1 = z2\n",
      "\n",
      "        # store the results\n",
      "        frame.row[t2] = y2\n",
      "\n",
      "    details = ModSimSeries(dict(success=True, message=msg))\n",
      "    return frame, details\n",
      "\n"
     ]
    }
   ],
   "source": [
    "source_code(run_ode_solver)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Related reading:** You might be interested in this article about [people making a DIY artificial pancreas](https://www.bloomberg.com/news/features/2018-08-08/the-250-biohack-that-s-revolutionizing-life-with-diabetes)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
